//导入zTool模块,并实例化
var zTool = require("./zTool");  
//实例化在线用户列表实体类
var onlineUserMap = new zTool.SimpleMap(); 
//实例化历史记录列表实体类
var historyContent = new zTool.CircleList(100);
//导入chatLib模块,并实例化
var chatLib = require("./chatLib");
var EVENT_TYPE = chatLib.EVENT_TYPE;
var PORT = chatLib.PORT;

//导入socket.io模块,并监听制定服务端口
var io =  require('socket.io').listen(PORT);

//监听该通道连接事件
io.sockets.on('connection',function(socket){
	//连接成功后回调监听message消息发送事件
	socket.on("message",function(message){
		//消息序列化为json对象
        var mData = chatLib.analyzeMessageData(message);
        if (mData && mData.EVENT) {
        	//判断动作类型
			switch (mData.EVENT) {
			case EVENT_TYPE.LOGIN: // 新用户连接
				//昵称不为空判断
				var nick=chatLib.getMsgFirstDataValue(mData);
				var newUser = {'uid':socket.id, 'nick':nick};

				// 把新连接的用户增加到在线用户列表
				onlineUserMap.put(socket.id, newUser);

				//将新登录用户信息序列化成json数据
                var data = JSON.stringify({
                'user':onlineUserMap.get(socket.id),
                'EVENT' : EVENT_TYPE.LOGIN,
                'values' : [newUser],
                'users':onlineUserMap.values(),
                'historyContent':historyContent.values()
               });
                // 把新用户的信息广播给在线用户
                io.sockets.emit('message',data);//广播,即促发message事件
                //socket.emit('message',data);
               // socket.broadcast.emit('message', data);//无效
				break;

			case EVENT_TYPE.SPEAK: // 用户发言
				//发言内容不为空判断
				var content = chatLib.getMsgFirstDataValue(mData);
				//序列化发言数据
                var data = JSON.stringify({
                    'user':onlineUserMap.get(socket.id),
                    'EVENT' : EVENT_TYPE.SPEAK,
                    'values' : [content]
                });
                //socket.emit('message',data);
                io.sockets.emit('message',data);
				historyContent.add({'user':onlineUserMap.get(socket.id),'content':content,'time':new Date().getTime()});
				break;

            case EVENT_TYPE.LOGOUT: // 用户请求退出
                var user = mData.values[0];
                onlineUserMap.remove(user.uid);
                var data = JSON.stringify({
                    'EVENT' : EVENT_TYPE.LOGOUT,
                    'values' : [user]
                });
              //广播,即促发message事件
                io.sockets.emit('message',data);
                break;
                
			    default:
				break;
			}

		} else {
			// 事件类型出错，记录日志，向当前用户发送错误信息
			console.log('desc:message,userId:' + socket.id + ',message:' + message);
            var data = JSON.stringify({
                'uid':socket.id,
                'EVENT' : EVENT_TYPE.ERROR
            });
            socket.emit('message',data);
		}
   });

});

console.log('Start listening on port ' + PORT);